perm filename XXRUN.SAI[X,ALS] blob
sn#086475 filedate 1974-02-07 generic text, type T, neo UTF8
00010 BEGIN "XRUN"
00020 DEFINE ⊂="COMMENT";
00030
00040 ⊂ This program runs another program, BXX, as a separate job and produces
00050 an XGP plot of formant data from the specified file. This program may
00060 be executed directly, in which case it requests info from the TTY, or it
00070 be called into being as a separate job and passed a number specifying
00080 the file to be used. In this second case this program automatically
00090 kills its job on completion;
00100
00110 DEFINE ⊃="⊂";
00120 DEFINE CR="'15",LF="'12",CRLF="CR&LF",TB="'11";
00130 INTEGER I,J,K,L,M,X,Y,LX,LY,DX,DY,CHAN5,CHAN1,EOF,BRCHR,
00140 PP,POINTP,FLAG,MUTE,NUM;
00150 STRING FILEP,FILEN,READ,MEMO; BOOLEAN ER;
00160 INTEGER ARRAY SAVE,JHSAVE[0:6];
00170 INTEGER ARRAY LFILE[0:127];
00180 INTEGER ARRAY NEW[0:511];
00190 INTEGER ARRAY DPYBUF[0:4096];
00200 INTEGER A1,A2,A3;
00210 LABEL STARTP;
00220 INTEGER DATE,TIME;
00230 DEFINE GETIME="BEGIN DATE←CALL(0,""DATE""); TIME←CALL(0,""TIMER"")%60; END;";
00240 PRELOAD_WITH "JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG",
00250 "SEP","OCT","NOV","DEC";
00260 STRING ARRAY MONTHS[0:11];
00270
00280 INTERNAL STRING PROCEDURE DATIM;
00290 BEGIN
00300 INTEGER DAY,YR,HRS,MIN,SEC;
00310 DAY←(DATE MOD 31)+1;DATE←DATE%31;
00320 YR←1964+DATE%12; SEC←TIME MOD 60;
00330 TIME←TIME%60; MIN←TIME MOD 60; HRS←TIME%60;
00340 SETFORMAT(-2,0);
00350 RETURN(CVS(DAY)&"-"&MONTHS[DATE MOD 12]&
00360 "-"&CVS(YR)&" "&CVS(HRS)&CVS(MIN)&":"&CVS(SEC));
00370 END;
00380
00390 INTERNAL STRING PROCEDURE WTIM;
00400 BEGIN
00410 DATE←SAVE[2] LAND '7777; TIME←LDB(POINT(11,SAVE[2],23))*60;
00420 RETURN(DATIM);
00430 END;
00440
00450 INTERNAL STRING PROCEDURE DATIME;
00460 BEGIN
00470 GETIME;
00480 RETURN(DATIM);
00490 END;
00500
00510
00520 ⊂ Allow 1140 units on a line corresponding to 76 charactters @15 units,
00530 380 segments @ 3 and 48640 samples @ 3/128 unit, or 2.432 seconds;
00540
00550
00560 PROCEDURE XPLOT;
00570 BEGIN "XPLOT"
00580 REQUIRE "SXF.REL[SAI,NJM]" LIBRARY;
00590 REQUIRE "XM.REL[PIT,NJM]" LIBRARY;
00600 REQUIRE "SIO.REL[SAI,NJM]" LIBRARY;
00610 EXTERNAL FORTRAN PROCEDURE XSET;
00620 EXTERNAL FORTRAN PROCEDURE XRVEC;
00630 EXTERNAL FORTRAN PROCEDURE XVEC;
00640 EXTERNAL FORTRAN PROCEDURE XIVEC;
00650 EXTERNAL FORTRAN PROCEDURE XIRVEC;
00660 EXTERNAL FORTRAN PROCEDURE XLINE;
00670 EXTERNAL FORTRAN PROCEDURE VERTAX;
00680 EXTERNAL FORTRAN PROCEDURE SWT25;
00690 EXTERNAL FORTRAN PROCEDURE PTX1;
00700 EXTERNAL FORTRAN PROCEDURE XOUT;
00710 EXTERNAL FORTRAN PROCEDURE XFIN;
00720 INTERNAL STRING XSTR,XSTR1,XSTR2,XSTRH;
00730 INTEGER IX,IX2,IY,XREF,YREF,X2,Y2,HT,XSAVE,XCUT;
00740 INTEGER MIN,MAX,ERR;
00750 MIN←0;
00760 MAX←3500;
00770 XREF←400;
00780 YREF←400;
00790 HT←700; ⊂ Allowing 5 inches for 5000 hertz;
00800 XSET;
00801
00805 IX←XREF-90; IY←YREF+740; XSTR←"Hertz"; SWT25(IX,IY);
00810 VERTAX(MIN,MAX,XREF,YREF,HT);
00830 IX←XREF-150;
00840 XSTR←" Null"; IY←YREF-225; SWT25(IX,IY);
00850 XSTR←" Silence"; IY←YREF-225+30; SWT25(IX,IY);
00860 XSTR←"Fricativ"; IY←YREF-225+60; SWT25(IX,IY);
00870 XSTR←"Voi.Fri."; IY←YREF-225+90; SWT25(IX,IY);
00880 XSTR←"Nas.Vow."; IY←YREF-225+120; SWT25(IX,IY);
00890 XSTR←" Voiced"; IY←YREF-225+150; SWT25(IX,IY);
00900
00910 XOUT(XREF-8);
00920 XSAVE←0;
00930
00940 CLOSE(CHAN5); OPEN(CHAN5,"DSK",'10,2,0,0,0,EOF);
00950 LOOKUP(CHAN5,FILEP,ERR);
00960 FILEINFO(SAVE);
00970 IF ERR THEN OUTSTR("FILE "&FILEP&" NOT FOUND"&CRLF);
00980 ARRYIN(CHAN5,LFILE[0],'200);
00990
01000 XSTR←""; FOR I←10 STEP 1 UNTIL 20 DO XSTR←XSTR&CVXSTR(LFILE[I]);
01010 IX←XREF; IY←YREF-300; SWT25(IX,IY);
01020 READ←WTIM; SETFORMAT(1,0);
01030
01040 XSTR←"The first "&CVS(NUM)&" formants in parameter file "
01050 &FILEP&" (created "&READ&")";
01060 IX←XREF; IY← YREF+900; SWT25(IX,IY);
01070 XSTR←"Mute level at "&CVS(MUTE)&". "&MEMO;
01080 IX←XREF+100; IY←YREF+870; SWT25(IX,IY);
01090 XSTR←"A.I. Laboratory, Stanford University. "&DATIME;
01100 IX←XREF+200; IY←YREF+840; SWT25(IX,IY);
01110
01120 FOR I←21 STEP 1 UNTIL 127 DO BEGIN "PONY"
01130 IF LFILE[I]=0 THEN DONE;
01140 L←LFILE[I] LAND '777760000000;
01150 J←LDB(POINT(14,LFILE[I],27))-1; K←LDB(POINT(8,LFILE[I],35))-1;
01160
01170 X←J*4+K*2-8; ⊂ X←(J+K%2)*128%32-8;
01180 IF X<XSAVE+16 THEN X←XSAVE+16; XSAVE←X;
01190 IX←XREF+X; IY←YREF-45; XSTR←(READ←CVSTR(L))[1 TO 1]; SWT25(IX,IY);
01200 IF (XSTR←READ[2 TO 2])≠"" THEN BEGIN
01210 IY←YREF-70; SWT25(IX,IY); END;
01220
01230 IX←XREF+J*4; IX2←IX+K*4;
01240 XLINE(IX,YREF-20,IX,YREF);
01250 XLINE(IX,YREF,IX2,YREF);
01260 XLINE(IX,YREF-1,IX2,YREF-1);
01270 XLINE(IX,YREF-2,IX2,YREF-2);
01280 XLINE(IX2,YREF,IX2, YREF-20);
01290
01300 END "PONY";
01310 OUTSTR("Text,");
01320 FOR I←0 STEP 625 UNTIL IX DO BEGIN "TIME"
01330 XLINE(XREF+I,YREF,XREF+I,YREF+20);
01340 FOR K←1 STEP 1 UNTIL 9 DO BEGIN
01350 IX←XREF+I+K*625%10; IF IX>IX2 THEN DONE "TIME";
01360 XLINE(IX,YREF,IX,YREF+10); END;
01370 END "TIME";
01380
01390 XCUT←IX2+200;
01400
01410
01420 FOR I←0 STEP 1 UNTIL 5 DO SAVE[I]←0; JHSAVE[0]←JHSAVE[1]←0;
01430 WHILE EOF=0 DO BEGIN "XDATIN"
01440 ARRYIN(CHAN5,NEW[0],512);
01445 IF NEW[0]=0 THEN DONE;
01450
01460 FOR I←1 STEP 1 UNTIL NUM DO BEGIN "XPLO"
01470 LY←SAVE[I]; LX←SAVE[0]; XIVEC(XREF+LX,YREF+LY);
01480 FOR J←0 STEP 8 UNTIL 504 DO BEGIN
01490 IF NEW[J]=0 THEN DONE;
01500 X←(NEW[J] LSH -15)%32;
01510 ⊂ Allowing 32 samples per unit or 3.125 inches per second;
01520 ⊂ This corresponds to 512 samples (32*16) per character;
01530
01540 POINTP←POINT(9,NEW[J+1],-1);
01550 FOR K←1 STEP 1 UNTIL I DO IBP(POINTP);
01560 Y← LDB(POINTP)*2000%256; ⊂ 5 inches for 5000 hertz;
01570
01580 IF Y=0 THEN Y←LY;
01590 DX←X-LX; LX←X; DY←Y-LY; LY←Y;
01600 IF (LDB(POINT(9,NEW[J+2],17)) < MUTE)∨(DX<3)
01610 THEN XIRVEC(DX,DY) ELSE XRVEC(DX,DY);
01620 END;
01630 SAVE[I]←LY;
01640 END "XPLO";
01650 LX←JHSAVE[0]; LY←JHSAVE[1];XIVEC(XREF+LX,YREF-212+LY);
01660
01670
01680 FOR J←0 STEP 8 UNTIL 504 DO BEGIN
01700 X←(NEW[J] LSH -15)%32;
01710 IF NEW[J]=0 THEN DONE;
01730
01740 Y← LDB(POINT(9,NEW[J+7],35))*30;
01750 DX←X-LX; LX←X; DY←Y-LY; LY←Y;
01760 XRVEC(DX,DY);
01770 END;
01780 JHSAVE[0]←LX; JHSAVE[1]←LY;
01790 XOUT(LX-2); OUTSTR(CVS(LX)&",");
01800
01810 IF X=0 THEN DONE "XDATIN";
01820 SAVE[0]←LX;
01830 END "XDATIN";
01840 CLOSE(CHAN5);
01850 XOUT(XCUT); OUTSTR(CVS(XCUT)&CRLF);
01860 IF XCUT<2200 THEN BEGIN XCUT←2200; XOUT(XCUT); END;
01870
01880 XFIN;
01890 END "XPLOT";
01900
00010 CHAN1←1; CHAN5←5;
00020 STDBRK(1);
00030 STARTP:
00040 MUTE←60; NUM←3;
00050 CLOSE(CHAN1); OPEN(CHAN1,"DSK",0,1,0,70,BRCHR,EOF);
00060 LOOKUP(CHAN1,"NUMBER.TMP",ER);
00070 IF ER THEN BEGIN
00080 OUTSTR("The following set-up commands of a letter followed by a number "
00090 &"may be given:"&CRLF);
00100 OUTSTR(" M# sets MUTE level (default value 60)"&CRLF&
00110 " N# sets number of formants (default value 3)."&CRLF);
00120 OUTSTR("A number only uses preset values for M and N and specifies the file to use."
00130 &CRLF&TB&"A CR only calls for file # 1."&CRLF&LF);
00140 SETFORMAT(1,0); FLAG←0; X←0;
00150 WHILE TRUE DO BEGIN "TYPE" OUTSTR("Type command "); READ←INCHWL;
00160 IF READ[1 TO 1]="M" THEN BEGIN MUTE←CVD(READ[2 TO 4]);CONTINUE "TYPE";END;
00170 IF READ[1 TO 1]="N" THEN BEGIN NUM←CVD(READ[2 TO 2]);CONTINUE "TYPE";END;
00180 DONE; END "TYPE";
00190 IF READ="" THEN PP←1 ELSE PP←CVD(READ);
00200 END ELSE BEGIN
00210 PP←CVD(INPUT(CHAN1,1));
00220 CLOSE(CHAN1);
00230 END;
00240
00250 FILEP←"SEG"&CVS(PP)&".SYN[2,JH]";
00260
00270 XPLOT;
00280 IF ER THEN PTOSTR(0,"RU BXX[PIT,NJM]"&CRLF) ELSE
00290 PTOSTR(0,"RU BXX[PIT,NJM]"&CRLF&"K"&CRLF);
00300
00310 END "XRUN";